package com.online.controller;

import com.faneui.common.utils.ListUtils;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.online.dal.dao.OrderDAO;
import com.online.dal.dao.OrderDetailDAO;
import com.online.dal.model.Order;
import com.online.dal.dao.ProductDAO;
import com.online.dal.model.OrderDetail;
import com.online.dal.model.Product;
import com.online.dal.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Map;

//使用@Controller时需要用@ResponseBody注释
@RestController//代表该类是充当Controller的作用
@RequestMapping("order")//RequestMapping是用来处理请求地址映射的注解，可用于类或方法上
public class OrderController {

    @Autowired//注解，它对类成员变量 方法及构造函数进行标注，完成自动装配的工作，通过使用来消除 set ，get方法
    private OrderDAO orderDAO;

    @Autowired//注解，它对类成员变量 方法及构造函数进行标注，完成自动装配的工作，通过使用来消除 set ，get方法
    private OrderDetailDAO orderDetailDAO;

    @Autowired//注解，它对类成员变量 方法及构造函数进行标注，完成自动装配的工作，通过使用来消除 set ，get方法
    private ProductDAO productDAO;

    @Autowired
    private HttpSession httpSession;

    @RequestMapping(value = "", method = RequestMethod.GET)
    public ModelAndView indexOfAll() throws Exception {
        ModelAndView mv = new ModelAndView("order");

        User u = (User) httpSession.getAttribute("user");//从会话中获取user对象赋值给u对象
        if (u == null) {
            mv = new ModelAndView("index");
            return mv;
        }
        Order para = new Order();//声明一个订单类型para对象
        para.setUser_id(u.getId());//将会话中用户id赋值给para对象--订单中用户ID
        List<Order> orderList = orderDAO.queryByModel(para);//通过用户id查询相关订单数据
        List<Map<String, Object>> dataMapList = Lists.newArrayList();
        for (Order order : orderList) {//循环用户相关订单，并赋值给order对象
            Map<String, Object>  dataMap = Maps.newHashMap() ;//声明一个Map类型dataMap对象
            //将每次循环得到每条订单数据赋值给dataMap对象
            dataMap.put("id",order.getId()) ;
            dataMap.put("sDate",order.getsDate()) ;
            dataMap.put("status",order.getStatus()) ;
            dataMap.put("totalPrice",order.getTotal_price()) ;

            OrderDetail param = new OrderDetail() ;//声明一个OrderDetail类型param对象
            param.setOrder_id(order.getId());//将每次循环得到的订单id赋值给param对象Order_id字段
            List<OrderDetail> orderDetails = orderDetailDAO.queryByModel(param) ;//查询相关订单明细
            List<Map<String, Object>> dataDetailMapList = Lists.newArrayList();
            for(OrderDetail orderDetail:orderDetails){//循环查询到的所有订单明细数据
                Map<String, Object>  dataDetailMap = Maps.newHashMap() ;//声明Map类型的dataDetailMap对象
                //将每次循环的订单明细数据赋值给dataDetailMap对象，创建订单明细列表
                dataDetailMap.put("num",orderDetail.getNum()) ;
                dataDetailMap.put("price",orderDetail.getPrice()) ;
                dataDetailMap.put("totalPrice",orderDetail.getNum() * orderDetail.getPrice()) ;
                dataDetailMap.put("productId",orderDetail.getProduct_id()) ;
                //根据订单明细中的用户id查询用户name并添加给dataDetailMap对象
                Product product = productDAO.queryById(orderDetail.getProduct_id()) ;
                dataDetailMap.put("productName",product.getName()) ;
                dataDetailMapList.add(dataDetailMap);//将dataDetailMap对象 添加到  给dataDetailMapList对象中
            }
            dataMap.put("orderDetailList",dataDetailMapList) ;
            dataMapList.add(dataMap) ;
        }
        mv.addObject("orderList", dataMapList);
        return mv;
    }
    //  @RequestMapping(value = "delete", method = RequestMethod.GET)
    // public ModelAndView delete() throws Exception {
    //   ModelAndView mv = new ModelAndView("order");
    //  orderDAO.deleteById("1");
    // orderDAO.deleteById("2");
    //  List<Order> orderList = orderDAO.queryByModel(new Order()) ;
    //   mv.addObject("orderList", orderList);
    //  return mv;
    //}
}
